/**
 * 
 */
package br.jus.tjpe.dao;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceException;
import javax.persistence.Query;
import br.jus.tjpe.dominio.EntidadeBase;

/**
 * @author clebertmoura
 * 
 */
public class DaoGenericoBase<T extends EntidadeBase> implements DaoGenerico<T> {

	@PersistenceContext(unitName = "treinamentoPU")
	private EntityManager entityManager;
	
	/**
	 * 
	 */
	public DaoGenericoBase() {
		// TODO Auto-generated constructor stub
	}
	
	/**
	 * @see br.jus.tjpe.dao.DaoGenerico#inserir(E)
	 */
	public <E> E inserir(E entidade) throws PersistenceException {
		EntityManager entityManager = getEntityManager();
		entityManager.persist(entidade);
		return entidade;
	}

	/**
	 * @see br.jus.tjpe.dao.DaoGenerico#editar(E)
	 */
	public <E> E editar(E entidade) throws PersistenceException {
		EntityManager entityManager = getEntityManager();
		entidade = entityManager.merge(entidade);
		return entidade;
	}

	/**
	 * @see br.jus.tjpe.dao.DaoGenerico#remover(E)
	 */
	public <E> E remover(E entidade) throws PersistenceException {
		EntityManager entityManager = getEntityManager();
		entidade = entityManager.merge(entidade);
		entityManager.remove(entidade);
		return entidade;
	}

	/**
	 * @see br.jus.tjpe.dao.DaoGenerico#buscarPorId(java.lang.Class, java.io.Serializable)
	 */
	public <E> E buscarPorId(Class<E> clazz, Serializable id)
			throws PersistenceException {
		EntityManager entityManager = getEntityManager();
		E entidade = entityManager.find(clazz, id);
		return entidade;
	}

	/**
	 * @see br.jus.tjpe.dao.DaoGenerico#buscarTodos()
	 */
	@SuppressWarnings("unchecked")
	public List<T> buscarTodos() throws PersistenceException {
		EntityManager entityManager = getEntityManager();
		List<T> list = new ArrayList<T>();
		Query query = entityManager.createQuery(String.format(
				"SELECT e FROM %s AS e", getClasseEntidade().getSimpleName()));
		list = query.getResultList();
		return list;
	}
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	protected Class getClasseEntidade(){
		Class clazz = (Class) getClass().getGenericSuperclass();
		ParameterizedType p = (ParameterizedType) clazz.getGenericSuperclass();
		return (Class<T>) p.getActualTypeArguments()[0];
	}
	
	protected EntityManager getEntityManager(){
		return this.entityManager;
	}

}
